Amazon SageMakerのRandom Cut Forestの概要(異常検知)
概要
こんにちは、データインテグレーション部のyoshimです。
SageMakerで「Random Cut Forest」というアルゴリズムが利用できるみたいなので、実際にチュートリアルを実施してみた感想を書こうと思います。
また、似たようなアルゴリズムである「Isolation Forest」との差異について述べてみようと思います。
もし、実際に自分でもやってみたいという方がいらっしゃいましたらこちらをご参照ください。
目次
1.異常検知とは
「異常検知」というとなんとなく「外れ値を見つける」ことだと思っていたのですが、下記の3つに分類されているとのことです。
(随分と古いですが、下記の説明はこちらの資料がすごくわかりやすかったのでこちらを参照することをお勧めします。)
1.外れ値検出
「仲間から値が外れている」データを見つけること。
仲間外れを探してあげることですね。
2.変化検知
時系列データにて、「変化が起きた時点」を特定すること
3.異常部位検出
時系列データにて、「変化が起きた時間帯」を特定すること
今回はこの3分類のより詳細な説明はせず、大まかに「異常検知は3つのタイプに分類されるのだなぁ」と思ってくだされば大丈夫です。
2.Random Cut Forestについて
端的に言うと、「異常検知に利用される」、「教師なし学習」、「決定木ベースのアンサンブル学習」です。
なお、AWSの紹介ブログを見ると、正確には「Robust random cut forest」というアルゴリズムを利用しているみたいです。
本アルゴリズムでは「異常データは、それ以外の普通のデータポイントと比較して簡単に分類できる。」ということを前提においています。
これは直感的にもなんとなく理解しやすいのではないでしょうか。AWSのブログでは、2次元のデータを仮定して説明しています。
以下、本アルゴリズムの流れになります。
1.データをサンプリングする
2.決定木をいっぱい作成する
3.作成した決定木における「深さの平均」をデータポイントごとに計算することで、「各データポイントの異常度スコア」を求める
4.設定した閾値と比較して異常データか判断する
より異常なデータは簡単に分類されるため、「深さの平均」が小さい値を示す一方、普通のデータは「その他のデータと分類するのが難しいため、深さの平均が大きくなる」ので、上記のように判断できるんですね。
3.Isolation Forestとの比較
Random Cut Forestと似たようなアルゴリズムで「Isolation Forest」というアルゴリズムがあります。
(というより、「Random Cut Forest」は「Isolation Forest」をベースとした発展系、と言えます)
折角なので、下記にて簡単に両アルゴリズムを比較してみましょう。
共通点
この2つのアルゴリズムは下記のような共通点があります。
・決定木ベースのアンサンブル学習
・教師なし学習
・異常データは「決定木で分類すると通常のデータと比較して早期に分類できる」という思想のもと、各データポイントの「深さの平均」を用いて異常度スコアを計算する
・カテゴリ型データには向かない
違うところ
下記の2点が大きな差異だと理解しています。
1.サンプリング手法
「iForest」,「Random Cut Forest」のいずれにおいても、各決定木を生成する際に元データからサンプリングをするのですが、「Random Cut Forest」では、「Reservoir sampling」なるサンプリング手法を使うことで効率的な抽出が実現できる、とのことです。
2.決定木を作成する際の、特徴量の選択基準
「isolation forest」だと、完全ランダムに特徴量を選択する一方、「Random Cut Forest」では「分散」に比例してどの特徴量を利用するかを選択しているようです。なぜ、「分散」を利用しているのかというと、「分類に役立たない特徴量(各データ間でほとんど差がない等)」を使っても正確に分類ができるかは怪しいところであり、それよりは「データによってばらつきがある特徴量」を使った方がより効率的に分類ができるから、といったものです。
特徴量を選択した後の、「分類する値」については両アルゴリズムで同じで「その特徴量のMAX-MIN」の間のいずれかの値でランダムに決定します。
ただ、ランダムに特徴量を選択する場合はそれはそれで特徴量が増減しても柔軟に対応できるので、それはそれでいい点はありそうですね。
4.チュートリアルをやってみた
まず、そもそものSageMakerの始め方ですが、こちらについては手前味噌ですが弊社のブログをご参照ください。
SageMakerはPythonのjupyterとほぼほぼ同じなので、jupyterを使い慣れている方にとっては始めやすいかと思います。
(マジックコマンド等も使えます)
続いて実際にモデルを生成するところですが、こちらはAWSのブログにあるコードを参考に進めました。
(S3バケット名、プレフィックス、下記に記載のパラメータ名の修正が必要です)
・AWSブログ
rcf.set_hyperparameters( num_samples_per_tree=200, num_trees=50, feature_size=1)
・こう修正
rcf.set_hyperparameters( num_samples_per_tree=200, num_trees=50, feature_dim=1) # ここのパラメータ名を修正
ちなみに、Jupyterでは「セルごと」にコマンドを実行できます。コーディングをしているうちはセルごとにコードを修正して、実行して、結果を見て、という工程を繰り返すことになるので、とても便利な機能だなぁと、思います。ある1つだけのセルを実行したい際は、セルを指定した状態で「ctrl + enter」を同時押しすれば実行できます。
これでとりあえず「異常検知」の「外れ値検出」を「Random Cut Forest」アルゴリズムでモデル生成するところまでできた状態です。
5.まとめ
今回は、SageMakerの「Random Cut Forest」というアルゴリズムについて調べてみたので、似たようなアルゴリズムである「Isolation Forest」との差異について概要を整理しました。
チュートリアルで利用しているデータは時系列データなので、シングリングしてからモデル生成するところまではやってみたいのですが、まだそこまでできていないので早く手をつけてみたいですね。
6.参考文献(順不同)
AWSのチュートリアル
AWSのブログ
PFIさんのスライド
「Robust random cut forest」の論文
「Isolation Forest」の論文